package cn.gx.learn.security_boot_jwt_websocket.websocket_origin.service;

import cn.gx.learn.security_boot_jwt_websocket.websocket_origin.dal.database.Message;
import cn.gx.learn.security_boot_jwt_websocket.websocket_origin.dal.mysql.MessageMapper;
import com.alibaba.fastjson.JSON;
import jakarta.websocket.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class MessageServiceImpl implements MessageService {

    @Autowired
    private MessageMapper  messageMapper;

    @Override
    public String sendMessageWhenOnline(Session session,Integer userId) {
        List<Message> messageoff=messageMapper.selectAllMessage(userId);
        if(!messageoff.isEmpty()){
            try {
            session.getBasicRemote().sendText(JSON.toJSONString(messageoff));
            //发送没问题之后更新状态为已读，如果需要前端查阅之后才更新，另写一个http去做更新，这里发送的状态码为0，前端可以有红点提醒，但未查看的情况下第二次登录就不会有提醒
                for(int i=0;i<messageoff.size();i++){
                    messageoff.get(i).setStatus(1);
                    messageMapper.updateById(messageoff.get(i));
                }


            return  "success";
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        else return "fail";
    }

    @Override
    public String sendMessageOffline(Message message) {
        message.setType(Message.MessageType.Chat);
        message.setSendTime(LocalDateTime.now());
        message.setStatus(0);
        messageMapper.insert(message);
        return "success";
    }



    //在我一个用户A给B发消息时，如果B不在线，会进入我的发离线消息方法，把消息状态置为0，然后插入数据库，但如果，在用户A发消息之后，系统判断B不在线（B的Session不存在），那么调用了离线方法，但在插库之前，我用户B登录了，调用onopen方法获取离线时的消息，但因为刚刚的消息还未插库，这段消息就获取不到
    @Override
    public String sendMessageOnline(Message message, Session session) {
        String mage = message.getMessage();
        if(session.isOpen()){
            //异步发送消息，又会有一个临界问题，发消息未读就下线的临界问题
            try {
                session.getBasicRemote().sendText(JSON.toJSONString(message));
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            message.setStatus(1);
            message.setSendTime(LocalDateTime.now());
            message.setType(Message.MessageType.Chat);
            messageMapper.insert(message);
            return "success";
        }
        return "fail";
    }
}
